package com.esbi.projectwebsocket.jwt;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    // 定义密钥，用于对 JWT 进行签名和验证，在实际应用中应妥善保管，避免泄露
    private static final String SECRET_KEY = "your_secret_key";

    // 生成 JWT 的方法
    public static String generateToken(String username) {
        // 创建一个空的声明集合，可用于存储用户角色、权限等信息
        Map<String, Object> claims = new HashMap<>();
        return Jwts.builder()
                // 设置声明集合
                .setClaims(claims)
                // 设置 JWT 的主体为传入的用户名，通常代表用户的唯一标识
                .setSubject(username)
                // 设置 JWT 的签发时间为当前时间
                .setIssuedAt(new Date())
                // 设置 JWT 的过期时间为当前时间加上 10 小时
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
                // 使用指定的签名算法（HS512）和密钥对 JWT 进行签名
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                // 生成并返回最终的 JWT 字符串
                .compact();
    }

    // 验证 JWT 的有效性的方法
    public static boolean validateToken(String token) {
        try {
            // 使用密钥解析 JWT，如果解析成功且没有抛出异常，说明 JWT 是有效的
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            // 如果在解析过程中出现任何异常，说明 JWT 可能被篡改或者已过期等，返回 false
            return false;
        }
    }

    // 从 JWT 中提取声明部分的方法
    public static Claims getClaimsFromToken(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }
}